<?php 
/**
 * CInstallazione.php
 * 
 * @author noskill
 * @package Controller
 */
/**
 * CInstallazione
 * 
 * @author mw
 * @package Controller
 *
 */
class CInstallazione extends CController {
	/**
	 * writableFolders
	 * 
	 * In questo array sono presenti le cartelle che devono essere scrivibili per il
	 * programma. Qualora su una delle cartelle non si hanno i permessi di scrittura
	 * l'installazione si interrompe
	 * 
	 * @var array $writableFolders
	 */
	public $writableFolders = array('includes','upload','View/Templates/compile');
	/**
	 * toClean
	 * 
	 * @var array $toClean
	 */
	public $toClean = array('installation','Controller/CInstallazione.php',
			'View/VInstallazione.php');	
	/**
	 * Costruttore
	 */
	public function __constrcut() {
		parent::__construct();
	}
	
	/**
	 * In base ai file di configurazione creati e al db, inoltra alla corretta fase di installazione
	 */
	public function router(){
		
		$vinstall = new VInstallazione();
		
		/**
		 * Controllo se posso scrivere in determinate cartelle
		 */
		
		$notWritable = false;
		foreach($this->writableFolders as $w){
			if(!is_writable($w)){
				$notWritable = $w;
				break;
			}
		}
		
		if($notWritable){
			$vinstall->errorFolders($w);
			return;
		}
		
		/**
		 * Controllo la connessione al db
		 * creo il file di configurazione
		 */
		if(!file_exists('includes/conf_db.php')){
			
			if($dati = $vinstall->getDatiFase1()){
				$this->createDbConf($dati);
				$vinstall->confDbCreated();
				return;
			}else{
				
				$vinstall->fase1();
				return;
				
			}
			
		}
		
		/**
		 * Mi connetto, in caso non va cancello il file di configurazione!
		 */
		if(!$this->connessioneDB()){
			$this->delDbConf();
			$vinstall->erroreDB('Connessione non riuscita, riprovare!');
			return;
		}
		
		/**
		 * Controllo che il db supporti INNODB come motore
		 */
		
		$result = Fdatabase::query('SHOW VARIABLES LIKE "have_innodb"');
		
		$trovato = false;
		while(($obj = $result->fetch_object()) && !$trovato ){
			
			if((strcmp($obj->Variable_name,'have_innodb')== 0) && (strcmp($obj->Value,'YES') == 0)){
				
				$trovato = true;
			}
		}
		
		if($trovato == false){
			$vinstall->innodbError();
			return;
		}
		
		
		/**
		 * Controllo che il db ci sia oppure scrivo il db 
		 */
		$result = Fdatabase::query('SHOW TABLES');
		
		if($result->num_rows == 0){
			if(!$this->populateDB()){
				$vinstall->erroreDB('Impossibile scrivere le tabelle!');
			}else{
				$vinstall->populatingDB();
			}
			return;
		}
		
		/**
		 *  Creo un amministratore!
		 */
		
		$futente = new FUtente();
		if(($dati = $vinstall->getDatiAdmin())){
			try{
				$eutente = new EUtente();
				$eutente->setUsername($dati['username']);
				$eutente->setEmail($dati['email']);
				$eutente->setNome($dati['nome']);
				$eutente->setCognome($dati['cognome']);
				$eutente->setPassword($dati['password']);
				$eutente->setLivello(AMMINISTRATORE);
				$eutente->setAttivato(1);
				$futente->store($eutente);
				
			}catch(ExceptionDati $d){
				$verr = new VError();
				$verr->errore('Errore','Errore nei dati inseriti','Riprova','index.php');
				return;
			}catch(ExceptionDB $e){
				$verr = new VError();
				$verr->errore('Errore','Errore nel db:'.$e->getCode(),'Riprova','index.php');
				return;
			}
			
		}else{
			try {
				$utenti = $futente->search(null,array('livello' => AMMINISTRATORE));
			}catch(ExceptionDB $e){
				$verr= new VError();
				$verr->errore('Errore','Errore db:'.$e->getCode(),'Riprova','index.php');
				return;
			}
			
			if($futente->getAffectedRows() == 0){
				
				$vinstall->formAdmin();
				return;
			}
		}
		
		/**
		 * Imposto ove presenti FACEBOOK_APPID e altro
		 */
		
		if(!file_exists('includes/social.php')){
			if($dati = $vinstall->getDatiSocial()){
				$this->createSocialConf($dati);
				$vinstall->confSocialCreated();
				return;
			}else{
			
				$vinstall->socialForm();
				return;
			
			}
			
			
		}
		/**
		 * Cancello tutti i file che hanno dato vita a sto macello
		 */
		$vinstall->end();
		$this->clearAll();
		return;
	}
	/**
	 * delDbConf
	 * 
	 * Cancella la configurazione al db
	 */
	private function delDbConf(){
		unlink('includes/conf_db.php');
	}
	/**
	 *  connessioneDB
	 *  @return boolean
	 */
	public function connessioneDB(){
		
		try{
			
			Fdatabase::_connect();
			return true;
			
		}catch(ExceptionDB $e){
			
			return false;
			
		}
		
	}
	/**
	 *  Creo la configurazione al db
	 *  @param array $dati
	 */
	private function createDbConf($dati){
		
		$conf = fopen('includes/conf_db.php','w');
		
		$text =<<<TEXT
<?php

define('DB_URL','{$dati['host']}');
define('DB_USER','{$dati['user']}');
define('DB_PASS','{$dati['pass']}');
define('DB_NAME','{$dati['nome']}');


TEXT;
		fwrite($conf,$text);
		fclose($conf);
	}
	/**
	 * Popolo il db
	 */
	private function populateDB(){
		
		$s = file_get_contents('installation/db.sql');
		try {
			Fdatabase::multi_query($s);
			return true;
		}catch(ExceptionDB $e){
			return false;
		}
		
	}
	/**
	 * Add social networks link
	 * @param array $dati
	 */
	public function createSocialConf($dati){
		
		$conf = fopen('includes/social.php','w');
		
		$text=<<<END
<?php
/**
 * social.php
 * 
 * Configurazione per l'integrazione con i social network
 */
/**
 * Facebook application ID
 * 
 * @var string
 */
define('FB_APP_ID','{$dati['fb_app_id']}');
/**
 * Facebook application secret
 * 
 * @var string
 */
define('FB_APP_SECRET','{$dati['fb_app_secret']}');

END;
		fwrite($conf,$text);
		fclose($conf);
		
		$conf2 = fopen('includes/site.php','w');
		
		$text=<<<END
<?php
/**
 * site.php
 * 
 * File contenente impostazioni per il sito
 */
/**
 * Sito
 * 
 * Il sito deve terminare con / (forward slash)
 * 
 * @var string
 */
define('SITE_URL','{$dati['url']}');
/**
 * Email 
 * @var string
 */
define('EMAIL_NOREPLY','{$dati['email-noreply']}');
/**
 * Email dell'amministratore
 * @var string
 */
define('EMAIL_ADMIN','{$dati['email-admin']}');

END;
		fwrite($conf2,$text);
		fclose($conf2);
	}
	
	/**
	 * clearAll
	 * 
	 * Cancella tutte le cartelle e i file usati nei processi di installazione
	 */
	public function clearAll(){
		rename('installation','installation_');
	}
	
}